﻿using QldtSdh.GUI.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace QldtSdh.GUI.DaoTao
{
    using BLL;
    using DAL;
    using DAL.Models;
    using GUI.Utils;
    using GUI.Common;
    using QldtSdh.Utils;

    public partial class UcLopHocPhan_DanhSachHocVien : QldtSdh.GUI.Common.BaseUserControl, IQuanLyLopHocPhan
    {
        private LopHocPhan _LopHocPhan = null;
        private UcQuanLyLopHocPhan _UcQuanLyLopHocPhan = null;
        private bool _DoNotUpdateGuiBySelectedLopHocPhan_HocVien = false;

        public UcLopHocPhan_DanhSachHocVien()
        {
            InitializeComponent();

            gridLopHocPhan_HocVien.SetDataGridViewAsReadonly(rowHeadersVisible: true, columnHeadersVisible: true);
            gridLopHocPhan_HocVien.AddRowIndexing();
            gridLopHocPhan_HocVien.DataSource = null;
        }

        public void SetLopHocPhan(DAL.Models.LopHocPhan lopHocPhan)
        {
            _LopHocPhan = lopHocPhan;
            tsDanhSachHocVien.Enabled = _LopHocPhan != null;
            NapDanhSachHocVien();
        }

        private void NapDanhSachHocVien()
        {
            _DoNotUpdateGuiBySelectedLopHocPhan_HocVien = true;
            try
            {
                if (_LopHocPhan == null)
                    bsLopHocPhan_HocVien.DataSource = null;
                else
                    bsLopHocPhan_HocVien.DataSource = new MySortableBindingList<LopHocPhan_HocVien>(BizLopHocPhan.GetListDangKyLopHocPhan(_LopHocPhan.MaLopHocPhanGUID));
                gridLopHocPhan_HocVien.SetDataSource(bsLopHocPhan_HocVien);
            }
            finally
            {
                _DoNotUpdateGuiBySelectedLopHocPhan_HocVien = false;
            }
            HienThiThongTinThongKeSoHocVien();
            UpdateGuiBySelectedLopHocPhan_HocVien();
        }

        private void HienThiThongTinThongKeSoHocVien()
        {
            if (bsLopHocPhan_HocVien.Count == 0)
                lblThongKeSoHocVien.Text = "Không có học viên nào";
            else
                lblThongKeSoHocVien.Text = string.Format("Có {0} học viên", bsLopHocPhan_HocVien.Count);
        }

        public void SetUcQuanLyLopHocPhan(UcQuanLyLopHocPhan parentUc)
        {
            _UcQuanLyLopHocPhan = parentUc;
        }

        private void UpdateGuiBySelectedLopHocPhan_HocVien()
        {
            LopHocPhan_HocVien x = null;
            if (bsLopHocPhan_HocVien.Current != null)
                x = bsLopHocPhan_HocVien.Current as LopHocPhan_HocVien;
            if (x == null)
            {
                btnRutDangKyHocVien.Enabled = btnTachLop.Enabled = false;
            }
            else
            {
                btnRutDangKyHocVien.Enabled = btnTachLop.Enabled = true;
            }
        }

        private void btnDangKyHocVien_Click(object sender, EventArgs e)
        {
            var dlg = new FormDangKyHocPhan(this._LopHocPhan);
            if (dlg.ShowDialog() == DialogResult.OK)
            {
                if (_UcQuanLyLopHocPhan != null)
                    _UcQuanLyLopHocPhan.NapDanhSachLopHocPhan();
            }
        }

        private void btnRutDangKyHocVien_Click(object sender, EventArgs e)
        {
            #region var lstLopHocPhan_HocVien = danh sách các học viên đang chọn
            var lstLopHocPhan_HocVien = new List<LopHocPhan_HocVien>();
            for (int i = 0; i < gridLopHocPhan_HocVien.Rows.Count; i++)
                if (gridLopHocPhan_HocVien.Rows[i].Selected)
                {
                    var item = gridLopHocPhan_HocVien.Rows[i].DataBoundItem as LopHocPhan_HocVien;
                    if (item == null)
                        continue;
                    lstLopHocPhan_HocVien.Add(item);
                }
            if (lstLopHocPhan_HocVien.Count == 0)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn ít nhất một học viên trước khi thực hiện thao tác này");
                return;
            }
            #endregion

            if (lstLopHocPhan_HocVien.Count > 1)
            {
                if (DialogUtils.Confirmed("Bạn có chắc chắn muốn rút đăng ký học phần của {0} học viên khỏi lớp học phần [{0}]-{1} không?",
                    lstLopHocPhan_HocVien.Count, _LopHocPhan.HocPhan.MaHocPhan, _LopHocPhan.HocPhan.TenHocPhan) == false)
                    return;
            }
            else
            {
                LopHocPhan_HocVien x = lstLopHocPhan_HocVien[0];
                if (DialogUtils.Confirmed("Bạn có chắc chắn muốn rút đăng ký học phần không?\r\n * Lớp học phần: [{0}]-{1}\r\n * Học viên: [{2}]-{3} {4}",
                    _LopHocPhan.HocPhan.MaHocPhan, _LopHocPhan.HocPhan.TenHocPhan, x.MaHocVien, x.HoDem, x.Ten) == false)
                    return;
            }

            try
            {
                BizLopHocPhan.RutDangKyHocVien(_LopHocPhan.MaLopHocPhanGUID, lstLopHocPhan_HocVien);
                if (lstLopHocPhan_HocVien.Count == 1)
                    gridLopHocPhan_HocVien.UpdatePosAfterDeleteRecord();
                else
                {
                    NapDanhSachHocVien();
                }
            }
            catch (Exception exc)
            {
                if (lstLopHocPhan_HocVien.Count == 1)
                {
                    var x = lstLopHocPhan_HocVien[0];
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể rút rút đăng ký học phần [{0}]-[{1}] của học viên [{2} {3}].\r\nChi tiết lỗi: {4}",
                       _LopHocPhan.HocPhan.MaHocPhan, _LopHocPhan.HocPhan.TenHocPhan, x.HoDem, x.Ten, exc.Message);
                }
                else
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể rút rút đăng ký học phần [{0}]-[{1}] cho {2} học viên.\r\nChi tiết lỗi: {3}",
                       _LopHocPhan.HocPhan.MaHocPhan, _LopHocPhan.HocPhan.TenHocPhan, lstLopHocPhan_HocVien.Count, exc.Message);
            }
        }

        private void bsLopHocPhan_HocVien_CurrentChanged(object sender, EventArgs e)
        {
            if (_DoNotUpdateGuiBySelectedLopHocPhan_HocVien)
                return;
            UpdateGuiBySelectedLopHocPhan_HocVien();
        }

        private void btnTachLop_Click(object sender, EventArgs e)
        {
            // 1. Lấy danh sách các học viên đang được chọn
            var lstLopHocPhan_HocVien = new List<LopHocPhan_HocVien>();
            for (int i = 0; i < gridLopHocPhan_HocVien.Rows.Count; i++)
                if (gridLopHocPhan_HocVien.Rows[i].Selected)
                {
                    var x = gridLopHocPhan_HocVien.Rows[i].DataBoundItem as LopHocPhan_HocVien;
                    if (x == null)
                        continue;
                    lstLopHocPhan_HocVien.Add(x);
                }
            if (lstLopHocPhan_HocVien.Count == 0)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn ít nhất một học viên trong danh sách để tách sang lớp học phần mới!");
                return;
            }
            if (lstLopHocPhan_HocVien.Count == bsLopHocPhan_HocVien.Count)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn không thể chọn toàn bộ học viên trong lớp này sang lớp học phần mới!");
                return;
            }

            if (DialogUtils.Confirmed("Bạn có chắc chắn muốn chuyển {0} học viên đang chọn sang lớp học phần được tạo mới không?", lstLopHocPhan_HocVien.Count) == false)
                return;

            try
            {
                BizLopHocPhan.ChuyenHocVienSangLopMoi(lstLopHocPhan_HocVien, _LopHocPhan);
                if (_UcQuanLyLopHocPhan != null)
                    _UcQuanLyLopHocPhan.NapDanhSachLopHocPhan();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Không thể chuyển {0} học viên đang chọn sang lớp học phần được tạo mới.\r\nChi tiết lỗi: {1}", lstLopHocPhan_HocVien.Count, exc.Message);
            }
        }

        private void btnNhapLop_Click(object sender, EventArgs e)
        {
            // Chọn 1 lớp học phần trong học kỳ. Lớp này phải cùng khoá đào tạo với lớp đang chọn (có thể khác ngành)
            var lopHocPhan = this._LopHocPhan;
            var lstLopHocPhan = BizDaoTao.GetListLopHocPhanCungKhoaHoc(lopHocPhan);
            if (lstLopHocPhan.Count == 0)
            {
                DialogUtils.ShowMessage(string.Format("Hiện tại không có lớp học phần cùng loại nào có thể nhập vào lớp học phần {0}", lopHocPhan.TenLopHocPhanFull));
                return;
            }

            // Thực hiện nhập lớp vừa chọn vào lớp học phần hiện tại
            var frm = new FormChonLopHocPhan(lstLopHocPhan, string.Format("Chọn lớp học phần để ghép với lớp học phần {0}", lopHocPhan.TenLopHocPhanFull));
            if (frm.ShowDialog() == DialogResult.OK)
            {
                var lopHocPhan2 = frm.SelectedLopHocPhan;
                try
                {
                    BizLopHocPhan.ChuyenHocVienSangLopKhac(tuLopHocPhan: lopHocPhan2, denLopHocPhan: lopHocPhan);
                    if (_UcQuanLyLopHocPhan != null)
                        _UcQuanLyLopHocPhan.NapDanhSachLopHocPhan();
                }
                catch (Exception exc)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể chuyển {0} học viên từ lớp [{1}] vào lớp [{2}] được\nChi tiết lỗi: {3}",
                        lopHocPhan2._SoHocVien, lopHocPhan2.TenLopHocPhanFull, lopHocPhan.TenLopHocPhanFull, exc.Message);
                }
            }
        }

        private void btnChuyenSangLHPKhac_Click(object sender, EventArgs e)
        {
            // 1. Lấy danh sách các học viên đang được chọn
            var lstLopHocPhan_HocVien = new List<LopHocPhan_HocVien>();
            for (int i = 0; i < gridLopHocPhan_HocVien.Rows.Count; i++)
                if (gridLopHocPhan_HocVien.Rows[i].Selected)
                {
                    var x = gridLopHocPhan_HocVien.Rows[i].DataBoundItem as LopHocPhan_HocVien;
                    if (x == null)
                        continue;
                    lstLopHocPhan_HocVien.Add(x);
                }
            if (lstLopHocPhan_HocVien.Count == 0)
            {
                DialogUtils.ShowErrorWithDefaultTitle("Bạn phải chọn ít nhất một học viên trong danh sách để chuyển sang lớp học phần khác!");
                return;
            }

            // Chọn 1 lớp học phần trong học kỳ. Lớp này phải cùng khoá đào tạo với lớp đang chọn (có thể khác ngành)
            var lopHocPhan = this._LopHocPhan;
            var lstLopHocPhan = BizDaoTao.GetListLopHocPhanCungKhoaHoc(lopHocPhan);
            if (lstLopHocPhan.Count == 0)
            {
                DialogUtils.ShowMessage(string.Format("Hiện tại không có lớp học phần cùng loại nào để có thể chuyển học viên từ lớp học phần [{0}]", lopHocPhan.TenLopHocPhanFull));
                return;
            }

            // Thực hiện nhập lớp vừa chọn vào lớp học phần hiện tại
            var frm = new FormChonLopHocPhan(lstLopHocPhan, "Chọn lớp học phần để chuyển học viên đến...");
            if (frm.ShowDialog() == DialogResult.OK)
            {
                var lopHocPhan2 = frm.SelectedLopHocPhan;
                try
                {
                    BizLopHocPhan.ChuyenHocVienSangLopKhac(lstLopHocPhan_HocVien, denLopHocPhan: lopHocPhan2);
                    if (_UcQuanLyLopHocPhan != null)
                        _UcQuanLyLopHocPhan.NapDanhSachLopHocPhan();
                }
                catch (Exception exc)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể chuyển {0} học viên từ lớp [{1}] vào lớp [{2}] được\nChi tiết lỗi: {3}",
                        lopHocPhan2._SoHocVien, lopHocPhan2.TenLopHocPhanFull, lopHocPhan.TenLopHocPhanFull, exc.Message);
                }
            }
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            if (_LopHocPhan.HocPhan == null)
            {
                var hocPhan = BizHocPhan.GetByID(_LopHocPhan.MaHocPhanGUID);
                if (hocPhan == null)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể xác định Học phần của lớp học phần {0}", _LopHocPhan.TenLopHocPhanFull);
                    return;
                }
                _LopHocPhan.HocPhan = hocPhan;
            }

            if (string.IsNullOrEmpty(_LopHocPhan._TenNganhDaoTao))
            {
                _LopHocPhan._TenNganhDaoTao = BizChuyenNganhDaoTao.GetChuyenNganhDaoTaoOfLopKhoaNganh(_LopHocPhan.MaLopKhoaNganhThamChieu);
            }

            var frm = new FormInBangChamDiemQTHT();
            frm.LoadReportData(bsLopHocPhan_HocVien.DataSource as IList<LopHocPhan_HocVien>,
                _LopHocPhan._TenHocPhan, _LopHocPhan._MaHocPhan, _LopHocPhan._SoTinChi, _LopHocPhan._TenNganhDaoTao, Program.FormMain.HocKy.TenHocKyDayDu);
            if (chkDoNotShowPrintPreview.Checked)
                PrintUtil.DoPrint(frm.LocalReport);
            else
                frm.ShowDialog();
        }

        private void inBảngTheoDõiQTHTToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_LopHocPhan.HocPhan == null)
            {
                var hocPhan = BizHocPhan.GetByID(_LopHocPhan.MaHocPhanGUID);
                if (hocPhan == null)
                {
                    DialogUtils.ShowErrorWithDefaultTitle("Không thể xác định Học phần của lớp học phần {0}", _LopHocPhan.TenLopHocPhanFull);
                    return;
                }
                _LopHocPhan.HocPhan = hocPhan;
            }

            if (string.IsNullOrEmpty(_LopHocPhan._TenNganhDaoTao))
            {
                _LopHocPhan._TenNganhDaoTao = BizChuyenNganhDaoTao.GetChuyenNganhDaoTaoOfLopKhoaNganh(_LopHocPhan.MaLopKhoaNganhThamChieu);
            }

            var frm = new FormInBangTheoDoiQTHTcs();
            frm.LoadReport(
                bsLopHocPhan_HocVien.DataSource as IList<LopHocPhan_HocVien>,
                _LopHocPhan._TenHocPhan,
                _LopHocPhan._MaHocPhan, _LopHocPhan._SoTinChi, _LopHocPhan._TenNganhDaoTao, Program.FormMain.HocKy.TenHocKyDayDu);
            if (chkDoNotShowPrintPreview.Checked)
                PrintUtil.DoPrint(frm.LocalReport, landscape: true);
            else
                frm.ShowDialog();
        }
    }
}
